package com.talos.framework.common.util.string;

import org.apache.commons.lang3.StringUtils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

/**
 * @Date 2019/3/21
 * @Description
 */
public class PhoneUtils {
    /**
     * 中国大陆手机区号
     */
    public static final String PHONE_AREA_CN = "+86";
    /**
     * 美国手机区号
     */
    public static final String PHONE_AREA_USA = "+1";
    /**
     * 中国香港手机区号
     */
    public static final String PHONE_AREA_HK = "+852";
    /**
     * 中国澳门手机区号
     */
    public static final String PHONE_AREA_MAC = "+853";
    /**
     * 中国台湾手机区号
     */
    public static final String PHONEN_AREA_TW = "+886";
    /**
     * 11位校验
     */
    public static final Integer PHONE_LEN = 11;
    public static final Integer MAC_PHONE_LEN = 8;
    public static final String PHONE_START = "1";
    public static final String MAC_PHONE_START = "6";

    /**
     * 手机号中间四位加密 传入18218545616 返回 182****5616
     *
     * @param phoneNo 传入手机号
     * @return 返回加密后的手机号字符串
     */
    public static String phoneEncry(String phoneNo) {
        if (StringUtils.isBlank(phoneNo)) {
            return "";
        } else {
            return phoneNo.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
        }
    }

    /**
     * 校验国际手机号规则
     *
     * @param cellphone
     * @return
     */
    public static boolean isPhoneNun(String phoneArea, String cellphone) {
        boolean flag = false;
        switch (phoneArea) {
            // 中国大陆
            case PHONE_AREA_CN:
                flag = checkIsCNPhone(cellphone);
                break;
            // 中国香港
            case PHONE_AREA_HK:
                flag = checkIsHKPhone(cellphone);
                break;
            //中国澳门
            case PHONE_AREA_MAC:
                flag = checkIsMACPhone(cellphone);
                break;
            //中国台湾
            case PHONEN_AREA_TW:
                flag = checkIsTWPhone(cellphone);
                break;
            case PHONE_AREA_USA:
                flag = checkIsUSAPhone(cellphone);
                break;
            default:
                break;

        }
        return flag;
    }

    /**
     * 澳门手机号（八位数，6开头）
     */
    public static boolean checkIsMACPhone(String str) throws PatternSyntaxException {
        if (str.startsWith(MAC_PHONE_START) && str.length() == MAC_PHONE_LEN) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 台湾手机号（十位数，09开头）
     */
    public static boolean checkIsTWPhone(String str) throws PatternSyntaxException {
        String regExp = "^([0][9])\\d{8}$";
        Pattern p = Pattern.compile(regExp);
        Matcher m = p.matcher(str);
        return m.matches();
    }

    /**
     * 美国手机号（555-555-5555）
     */
    public static boolean checkIsUSAPhone(String str) throws PatternSyntaxException {
        String regExp = "/^(((1(\\s|))|)\\([1-9]{3}\\)(\\s|-|)[1-9]{3}(\\s|-|)[1-9]{4})$/";
        Pattern p = Pattern.compile(regExp);
        Matcher m = p.matcher(str);
        return m.matches();
    }

    /**
     * 大陆手机号码11位数,匹配格式:前三位固定格式+后8位任意数
     * 此方法中前三位格式有:
     * 13+任意数
     * 15+除4的任意数
     * 18+除4的任意数
     * 17+除9的任意数
     * 147
     * <p>
     * 按要求不进行正则校验，只要从1开始就算合规，且为11位数字，--2019-7-3
     */
    public static boolean checkIsCNPhone(String str) throws PatternSyntaxException {
        String regExp = "^[0-9]*$";
        Pattern p = Pattern.compile(regExp);
        Matcher m = p.matcher(str);
        return m.matches() && str.startsWith(PHONE_START) && str.length() == PHONE_LEN;
    }

    public static void main(String[] args) {
        boolean b = checkIsMACPhone("62227777");
        System.out.println(b);
    }

    /**
     * 香港手机号码8位数,5|6|8|9开头+7位任意数
     */
    public static boolean checkIsHKPhone(String str) throws PatternSyntaxException {
        String regExp = "^(5|6|8|9)\\d{7}$|^(5|6|8|9)\\d{8}$";
        Pattern p = Pattern.compile(regExp);
        Matcher m = p.matcher(str);
        return m.matches();
    }
}
